#!/bin/bash

fail=0
testcount=0

EXPECT_success() {
  (( ++testcount ))
  if ! "$@"; then
    (( ++fail ))
    printf 'expectation failed: did not succeed: %s\n' "$*" >&2
  fi
}

EXPECT_failure() {
  (( ++testcount ))
  if "$@"; then
    (( ++fail ))
    printf 'expectation failed: did not fail: %s\n' "$*" >&2
  fi
}

TEST_exit() {
  local result

  trap -- EXIT

  (( fail == 0 )) && result=PASS || result=FAIL

  printf '%s: %s\n' "$result" "$1"

  exit $(( fail != 0 ))
}

ASSERT_streq() {
  if [[ $1 != "$2" ]]; then
    printf 'assertion failed [line %d]: [[ %s = "%s" ]]\n' "$BASH_LINENO" "$1" "$2" >&2
  fi
}

TEST_start() {
  trap "TEST_exit '$1'" EXIT
}

TEST_start "${0##*/test_}"

